package com.heima.se.sjms.享元;

/*
    享元模式  -- 原型模式
        以一个对象为原型，来创建另外的对象。

    深拷贝： 拷贝的对象与原始对象本身地址不一样,并且属性地址也不一样，连带着对象的属性也会跟着拷贝。
    浅拷贝： 拷贝的对象与原始对象本身地址不一样，但是两个对象的属性都一样。

    应用场景： Spring中的设置bean为多例： Scope=prototype就是基于原型模式实现的
 */

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {

        Cls cls = new Cls();
        cls.setCname("JavaEE62期");

        Student stu1 = new Student();
        stu1.setName("张三");
        stu1.setAge(23);
        stu1.setCls(cls);
        System.out.println("stu1 = " + stu1);

        //需求1：以stu1为原型，创建一个新的学生对象：stu2
        Object stu2 = stu1.clone();
        System.out.println("stu2 = " + stu2);
    }
}

class Student implements Cloneable{
    private String name;
    private int age;
    private Cls cls;


    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student cloneStu = (Student) super.clone();
        Cls cls = cloneStu.getCls();
        Cls cls1 = (Cls) cls.clone();
        cloneStu.setCls(cls1);
        return cloneStu;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cls=" + cls +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Cls getCls() {
        return cls;
    }

    public void setCls(Cls cls) {
        this.cls = cls;
    }
}


class Cls implements Cloneable{
    private String cname;


    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Cls{" +
                "cname='" + cname + '\'' +
                '}';
    }
}
